﻿// Copyright (C) 2009 Choonghwan Lee (linjus.lee@gmail.com)
//
// This file is part of amanda.
//
// amanda is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// amanda is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with amanda. If not, see <http://www.gnu.org/licenses/>.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace manager
{
	public static class Romanization
	{
		static class Korean
		{
			private static string[] chosungtbl = new string[]
			{
				"g",	// ㄱ
				"kk",	// ㄲ
				"n",	// ㄴ
				"d",	// ㄷ
				"tt",	// ㄸ
				"r",	// ㄹ
				"m",	// ㅁ
				"b",	// ㅂ
				"pp",	// ㅃ
				"s",	// ㅅ
				"ss",	// ㅆ
				"",		// ㅇ
				"j",	// ㅈ
				"jj",	// ㅉ
				"ch",	// ㅊ
				"k",	// ㅋ
				"t",	// ㅌ
				"p",	// ㅍ
				"h",	// ㅎ
			};
			private static string[] jungsungtbl = new string[]
			{
				"a",	// ㅏ
				"ae",	// ㅐ
				"ya",	// ㅑ
				"yae",	// ㅒ
				"eo",	// ㅓ
				"e",	// ㅔ
				"yeo",	// ㅕ
				"ye",	// ㅖ
				"o",	// ㅗ
				"wa",	// ㅘ
				"wae",	// ㅙ
				"oe",	// ㅚ
				"yo",	// ㅛ
				"u",	// ㅜ
				"wo",	// ㅝ
				"we",	// ㅞ
				"wi",	// ㅟ
				"yu",	// ㅠ
				"eu",	// ㅡ
				"ui",	// ㅢ
				"i",	// ㅣ
			};
			private static string[] jongsungtbl = new string[]
			{
				"",		//
				"k",	// ㄱ
				"kk",	// ㄲ
				"ks",	// ㄳ
				"n",	// ㄴ
				"nj",	// ㄵ
				"nh",	// ㄶ
				"t",	// ㄷ
				"l",	// ㄹ
				"lk",	// ㄺ
				"lm",	// ㄻ
				"lp",	// ㄼ
				"ls",	// ㄽ
				"lt",	// ㄾ
				"lp",	// ㄿ
				"lh",	// ㅀ
				"m",	// ㅁ
				"p",	// ㅂ
				"ps",	// ㅄ
				"s",	// ㅅ
				"ss",	// ㅆ
				"ng",	// ㅇ
				"j",	// ㅈ
				"ch",	// ㅊ
				"k",	// ㅋ
				"t",	// ㅌ
				"p",	// ㅍ
				"h",	// ㅎ
			};

			internal static string Convert(string input)
			{
				string ret = "";
				foreach (char ch in input) {
					// AC00 ~ D7A3 = 2BA3 (11171)
					// 10101110100011
					// 19, 21, 28

					int us = (int)ch;
					if (0xAC00 <= us && us <= 0xD7A3) {
						int hangul = us - 0xAC00;
						int jongsung = hangul % 28;
						int jungsung = (hangul / 28) % 21;
						int chosung = hangul / (21 * 28);

						string ja = chosungtbl[chosung] + jungsungtbl[jungsung] + jongsungtbl[jongsung];
						if (ja.Length > 0) {
							ret += char.ToUpper(ja[0]);
							ret += ja.Substring(1);
						}
					}
					else {
						ret += ch;
					}
				}
				return ret;
			}
		}

		public static string Convert(string input)
		{
			return Korean.Convert(input);
		}
	}
}
